package com.srv.dao;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.srv.exceptions.CidadeInvalidaException;
import com.srv.exceptions.EstadoInvalidoException;
import com.srv.pojo.Cidade;
import com.srv.pojo.Estado;

public class DAOCidade extends DAOGenerico implements DAOGenericoInterface {

	private DAOEstado daoEstado;

	public DAOCidade() throws ClassNotFoundException, SQLException {
		super();
		this.daoEstado = new DAOEstado();
	}

	@Override
	public void insert(Object object) throws SQLException {
		Connection connection = this.getConnection();
		Statement st = connection.createStatement();
		Cidade cidade = (Cidade) object;
		// daoEstado.insert(cidade.getEstado());
		String cmdInsert = "INSERT INTO cidade VALUES (" + cidade.getCicode()
				+ "," + cidade.getCep() + "," + cidade.getNome() + ","
				+ cidade.getEstado().getEscode() + ");";
		st.executeUpdate(cmdInsert);
		st.close();
	}

	@Override
	public void update(Object object) throws Exception {
		Connection connection = this.getConnection();
		Statement st = connection.createStatement();
		Cidade cidade = (Cidade) object;
		String cmdUpdate = "UPDATE cidade SET ";
		List<Estado> estados = daoEstado.getEstadoList();
		if (!estados.contains(cidade.getEstado())
				|| cidade.getEstado().getEscode() == 0) {
			throw new EstadoInvalidoException(
					"A cidade está em um estado inexistente!");
		}
		if (cidade.getNome().equals("")) {
			throw new CidadeInvalidaException(
					"O nome da cidade não pode ser vazio!");
		}
		cmdUpdate.concat("escode = " + cidade.getEstado().getEscode() + ","
				+ "nome = " + cidade.getNome() + "," + "cep = "
				+ cidade.getCep());
		
		cmdUpdate.concat(" WHERE cicode = " + cidade.getCicode() + ";");
		st.executeUpdate(cmdUpdate);
		st.close();
	}

	@Override
	public void delete(Object object) throws Exception {
		Connection connection = this.getConnection();
		Statement st = connection.createStatement();
		Cidade cidade = (Cidade) object;
		if (!this.getCidadeList().contains(cidade)){
			throw new CidadeInvalidaException("A cidade não pode ser excluída pois não existe na base de dados " + cidade.getNome());
		}
		String cmdDelete = "DELETE FROM cidade WHERE cicode = "
				+ cidade.getCicode() + ";";
		st.executeUpdate(cmdDelete);
		st.close();
	}

	public List<Cidade> getCidadeList() throws SQLException,
			ClassNotFoundException {
		ResultSet rs = this
				.getResultSet("SELECT * FROM cidade c");
		List<Cidade> cidadeList = new ArrayList<Cidade>();
		DAOEstado daoEstado = new DAOEstado();
		Cidade cidade = null;
		while (rs.next()) {
			cidade = new Cidade();
			cidade.setCicode(rs.getInt("cicode"));
			cidade.setEstado(daoEstado.getEstadoByEscode(rs.getInt("escode")));
			cidade.setNome(rs.getString("nome"));
			cidade.setCep(rs.getString("cep"));
			cidadeList.add(cidade);
		}
		rs.close();
		return cidadeList;
	}

	public Cidade getCidadeByCicode(int cicode) throws SQLException,
			ClassNotFoundException {
		ResultSet rs = this
				.getResultSet("SELECT c.cicode, c.escode, c.nome, c.cep FROM cidade c WHERE c.cicode = "
						+ cicode);
		DAOEstado daoEstado = new DAOEstado();
		Cidade cidade = new Cidade();
		while (rs.next()) {
			cidade.setCicode(rs.getInt("cicode"));
			cidade.setEstado(daoEstado.getEstadoByEscode(rs.getInt("escode")));
			cidade.setNome(rs.getString("nome"));
			cidade.setCep(rs.getString("cep"));
		}
		rs.close();
		return cidade;
	}

	public boolean existeCidade(Cidade cidade) throws Exception {
		ResultSet rs = this.getResultSet("SELECT 1 as existe FROM cidade c WHERE c.cicode = " + cidade.getCicode());
		while (rs.next()){
			if (rs.getInt("existe")==1){
				rs.close();
				return true;
			}
		}
		rs.close();
		return false;
	}
	
	public Cidade getCidadeByCep(String cep) throws SQLException,
			ClassNotFoundException {
		ResultSet rs = this
				.getResultSet("SELECT c.cicode, c.escode, c.nome, c.cep FROM Cidade c WHERE c.cep = "
						+ cep);
		DAOEstado daoEstado = new DAOEstado();
		Cidade cidade = new Cidade();
		while (rs.next()) {
			cidade.setCicode(rs.getInt("cicode"));
			cidade.setEstado(daoEstado.getEstadoByEscode(rs.getInt("escode")));
			cidade.setNome(rs.getString("nome"));
			cidade.setCep(rs.getString("cep"));
		}
		rs.close();
		return cidade;
	}

}
